草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 为什么 C++ STL 如此大量地基于模板? (而不是在*接口(interface)*上)

我的意思是,除了它的强制性名称(标准模板库)...C++最初打算将OOP概念呈现到C中。也就是说:您可以根据其类和类层次结构来判断特定实体可以做什么和不能做什么(无论它如何做)。由于多重继承的问题,以及C++以某种笨拙的方式支持接口(interface)概念的事实(与java等相比),一些能力的组合更难以用这种方式描述,但它就在那里(并且可能是改进)。然后模板和STL一起发挥了作用。STL似乎采用了经典的OOP概念并将它们冲入下水道,而是使用模板。当使用模板来泛化类型本身与模板(例如容器)的操作无关的类型时,应该区分情况。有一个vector完全有道理。然而,在许多其他情况下(迭代器和算

c++ - 资源获取即初始化 (RAII) 是什么意思?

ResourceAcquisitionisInitialization(RAII)是什么意思? 最佳答案 对于一个非常强大的概念来说,这是一个非常糟糕的名字,也许是C++开发人员在切换到其他语言时最想念的第一件事。尝试将这个概念重命名为Scope-BoundResourceManagement的运动已经发生了一些变化,尽管它似乎还没有流行起来。当我们说“资源”时,我们不仅仅指内存——它可以是文件句柄、网络套接字、数据库句柄、GDI对象……简而言之,我们的资源有限,因此我们需要能够控制它们的使用。“范围绑定(bind)”方面意味着对象

c++ - 资源获取即初始化 (RAII) 是什么意思?

ResourceAcquisitionisInitialization(RAII)是什么意思? 最佳答案 对于一个非常强大的概念来说,这是一个非常糟糕的名字,也许是C++开发人员在切换到其他语言时最想念的第一件事。尝试将这个概念重命名为Scope-BoundResourceManagement的运动已经发生了一些变化,尽管它似乎还没有流行起来。当我们说“资源”时,我们不仅仅指内存——它可以是文件句柄、网络套接字、数据库句柄、GDI对象……简而言之,我们的资源有限,因此我们需要能够控制它们的使用。“范围绑定(bind)”方面意味着对象

c++ - C++ 是否支持 'finally' block ? (我一直听到的这个 'RAII' 是什么?)

C++是否支持'finally'block?什么是RAIIidiom?C++的RAII习语和C#'s'using'statement有什么区别?? 最佳答案 不,C++不支持“finally”block。原因是C++支持RAII:“ResourceAcquisitionIsInitialization”——一个真正有用的概念糟糕的名字†。这个想法是对象的析构函数负责释放资源。当对象具有自动存储持续时间时,对象的析构函数将在创建它的block退出时被调用——即使该block在存在异常的情况下退出。这里是BjarneStroustrup

c++ - C++ 是否支持 'finally' block ? (我一直听到的这个 'RAII' 是什么?)

C++是否支持'finally'block?什么是RAIIidiom?C++的RAII习语和C#'s'using'statement有什么区别?? 最佳答案 不,C++不支持“finally”block。原因是C++支持RAII:“ResourceAcquisitionIsInitialization”——一个真正有用的概念糟糕的名字†。这个想法是对象的析构函数负责释放资源。当对象具有自动存储持续时间时,对象的析构函数将在创建它的block退出时被调用——即使该block在存在异常的情况下退出。这里是BjarneStroustrup

c++ - C/C++ 包含头文件顺序

应该指定什么顺序包含文件,即在另一个之前包含一个标题的原因是什么?例如,系统文件、STL和Boost是放在本地包含文件之前还是之后? 最佳答案 我不认为有推荐的顺序,只要它编译!令人讨厌的是,当某些header需要首先包含其他header时...这是header本身的问题,而不是包含的顺序。我个人的偏好是从本地到全局,每个小节按字母顺序排列,即:这个cpp文件对应的h文件(如果有的话)来自同一组件的header,来自其他组件的header,系统header。我对1.的理由是它应该证明每个header(有一个cpp)可以在没有先决条件

c++ - C/C++ 包含头文件顺序

应该指定什么顺序包含文件,即在另一个之前包含一个标题的原因是什么?例如,系统文件、STL和Boost是放在本地包含文件之前还是之后? 最佳答案 我不认为有推荐的顺序,只要它编译!令人讨厌的是,当某些header需要首先包含其他header时...这是header本身的问题,而不是包含的顺序。我个人的偏好是从本地到全局,每个小节按字母顺序排列,即:这个cpp文件对应的h文件(如果有的话)来自同一组件的header,来自其他组件的header,系统header。我对1.的理由是它应该证明每个header(有一个cpp)可以在没有先决条件

c++ - 如何获取程序运行的目录?

是否有一种平台无关和文件系统无关的方法来获取使用C/C++运行程序的目录的完整路径?不要与当前工作目录混淆。(请不要推荐库,除非它们是标准库,如clib或STL。)(如果没有与平台/文件系统无关的方法,也欢迎在Windows和Linux中针对特定文件系统工作的建议。) 最佳答案 获取执行应用的完整路径的代码如下:window:charpBuf[256];size_tlen=sizeof(pBuf);intbytes=GetModuleFileName(NULL,pBuf,len);returnbytes?bytes:-1;Linux

c++ - 如何获取程序运行的目录?

是否有一种平台无关和文件系统无关的方法来获取使用C/C++运行程序的目录的完整路径?不要与当前工作目录混淆。(请不要推荐库,除非它们是标准库,如clib或STL。)(如果没有与平台/文件系统无关的方法,也欢迎在Windows和Linux中针对特定文件系统工作的建议。) 最佳答案 获取执行应用的完整路径的代码如下:window:charpBuf[256];size_tlen=sizeof(pBuf);intbytes=GetModuleFileName(NULL,pBuf,len);returnbytes?bytes:-1;Linux

c++ - 如何实现 STL 风格的迭代器并避免常见的陷阱?

我创建了一个集合,我想为其提供一个STL风格的随机访问迭代器。我正在四处寻找迭代器的示例实现,但没有找到。我知道[]和*运算符需要const重载。迭代器要成为“STL风格”的要求是什么?还有哪些其他需要避免的陷阱(如果有的话)?附加上下文:这是一个库,我不想引入任何对它的依赖,除非我真的需要。我编写了自己的集合,以便能够使用相同的编译器提供C++03和C++11之间的二进制兼容性(因此没有可能会破坏的STL)。 最佳答案 https://cplusplus.com/reference/iterator/有一个方便的图表,详细说明了C